package com.smsc.headend.connector.netty;

import cn.hutool.core.date.SystemClock;

import java.util.Arrays;
import java.util.concurrent.*;

public class SyncFuture implements Future {
    // 因为请求和响应是一一对应的，因此初始化CountDownLatch值为1。
    private CountDownLatch latch = new CountDownLatch(1);

    // 需要响应线程设置的响应结果
    private byte[] response;

    // Futrue的请求时间，用于计算Future是否超时
    private long beginTime = SystemClock.now();

    public SyncFuture() {
    }

    @Override
    public boolean cancel(boolean mayInterruptIfRunning) {
        return false;
    }

    @Override
    public boolean isCancelled() {
        return false;
    }

    @Override
    public boolean isDone() {
        if (response != null) {
            return true;
        }
        return false;
    }

    // 获取响应结果，直到有结果才返回。
    @Override
    public byte[] get() throws InterruptedException {
        latch.await();
        return this.response;
    }

    // 获取响应结果，直到有结果或者超过指定时间就返回。
    @Override
    public byte[] get(long timeout, TimeUnit unit) throws InterruptedException {
        if (latch.await(timeout, unit)) {
            return this.response;
        }
        return null;
    }

    // 用于设置响应结果，并且做countDown操作，通知请求线程
    public void setResponse(byte[] response) {
        if (response == null) {
            this.response = new byte[0];
        }
        else {
            this.response = Arrays.copyOf(response, response.length);
        }
        latch.countDown();
    }

    public long getBeginTime() {
        return beginTime;
    }
}
